package gaarason.database.appointment;

/**
 * 事物传播性
 * @author xt
 */
public enum Propagation {

    /**
     * 可以加入"已存在的事务"，（如果该方法出现异常，会回滚"已存在的事务"的所有操作）。如果不存在事务，则创建事务。
     */
    REQUIRED,

    /**
     * 可以加入"已存在的事务"，（如果该方法出现异常，会回滚"已存在的事务"的所有操作）。如果不存在事务，则以非事务方式执行。
     */
    SUPPORTS,

    /**
     * 可以加入"已存在的事务"，如果不存在事务，则跑出异常。（强制要求有事务。）
     */
    MANDATORY,

    /**
     * 一定创建新事务，如果存在当前事务，则挂起当前事务。（实现独立回滚，独立提交。）
     * 根据事务隔离级别, 可能看不到父级事务中的未提交数据
     */
    REQUIRES_NEW,

    /**
     * 不加入"已存在的事务"，始终以非事务方式执行。
     */
    NOT_SUPPORTED,

    /**
     * 不支持事务，如果存在事务，则抛出异常。
     */
    NEVER,

    /**
     * 如果不存在事务，创建事务。如果存在事务，则嵌套在事务内，嵌套事务依赖外层事务提交，不进行独立事务提交。
     * 嵌套事务如果发生异常，则抛出异常，回滚嵌套事务的操作，回到开始嵌套事务的“保存点”，由外层事务的逻辑继续执行（外层捕获异常并处理即可）。
     * 嵌套事务如果不发生异常，则继续执行，不提交。由外层事务的逻辑继续执行，若外层事务后续发生异常，则回滚包括嵌套事务在内的所有事务。
     * 与PROPAGATION_REQUIRES_NEW的区别：嵌套事务由外层事务决定提交，而PROPAGATION_REQUIRES_NEW独立提交。
     * 与PROPAGATION_REQUIRED的区别：发生异常时，嵌套事务回滚至嵌套事务开始处（即“保存点”），PROPAGATION_REQUIRED没有保存点。
     */
    NESTED

}
